#ifndef FTRACE_H
#define FTRACE_H


#include "common.h"
#include "elfparser.h"
#include <cpu/decode.h>
#include <stddef.h>

typedef struct FrameEntry_ {
    vaddr_t src_addr;        // 当前指令所在地址
    vaddr_t dst_addr;        // 将要跳转到的地址, 即目标地址
    FuncEntry* src_func;    // 当前指令所处的函数
    FuncEntry* dst_func;    // 目标地址指令所在函数
    size_t depth;           // 当前所在调用栈的深度
    int type;               // 指令类型: call / return
} FrameEntry;

/* copy from nanos-lite fs.c, ramdisk 由 navy-apps 提供 */
typedef struct RamDiskFileInfo_ {
    char *name;			// 文件名
    size_t size;		// 文件大小
    size_t disk_offset;	// 文件在 ramdisk 中的偏移
} RamDiskFileInfo;

enum FrameType { FrameCall, FrameReturn };

void init_ftrace(const char* elf_file, const char* ramdisk_file, const char* appname);
void ftrace_print();
void ftrace_inst_jalr(Decode* s);
void ftrace_inst_jal(Decode* s);

#endif